<?php

require_once "EntidadBase.php";  

class Usuario extends EntidadBase implements JsonSerializable
{
	private $pas;
	private $NombreUsuario;
	private $Nombre;
	private $Apellidos;
	private $Email;
	private $FechaNacimiento;
	private $Genero;
	private $TelefonoMovil;
	private $FechaAlta;
	private $FechaBaja;
	private $FechaSisAlta;
	private $FotoPerfil;

	// lectura y escritura de propiedades
	public function GetPas()
	{
		return $this->pas;
	}

	public function SetPas($pas)
	{
		if(!isset($pas) || empty($pas))
		{
			throw new Exception('El password no puede ser nulo o vacio.');
		}
		$this->pas = $pas;
	}

	public function GetNombreUsuario()
	{
		return $this->NombreUsuario;
	}

	public function SetNombreUsuario($nombreusuario)
	{
		if(!isset($nombreusuario) || empty($nombreusuario))
		{
			throw new Exception('El alias de usuario no puede ser nulo o vacio.');
		}

		if(!is_string($nombreusuario) || strlen($nombreusuario) <= 4 || strlen($nombreusuario) > 8)
		{
			throw new Exception('El nombre de usuario debe tener entre 5 y 8 caracteres');
		}

		if(preg_match("/\W\//", $nombreusuario) == 1)
		{
			throw new Exception('El alias de usuario solo debe tener letras, numeros y guiones bajos (_).');
		}

		$this->NombreUsuario = $nombreusuario;
	}

	public function GetFotoPerfil()
	{
		return $this->FotoPerfil;
	}

	public function SetFotoPerfil($foto)
	{
		if(isset($foto) || !empty($foto))
		{
			$this->FotoPerfil = $foto;
		}
	}

	public function GetNombre()
	{
		return $this->Nombre;
	}

	public function SetNombre($nombre)
	{
		if(!isset($nombre) || empty($nombre))
		{
			throw new Exception('El nombre del usuario no puede ser nulo o vacio.');
		}

		if(!is_string($nombre) || strlen($nombre) > 100)
		{
			throw new Exception('El nombre del usuario debe se una cadena de no mas de 100 caracteres.');
		}

		$this->Nombre = $nombre;
	}

	public function GetApellidos()
	{
		return $this->Apellidos;
	}

	public function SetApellidos($apellidos)
	{
		if(!isset($apellidos) || empty($apellidos))
		{
			throw new Exception('Los apellidos no puede ser nulos o vacios.');
		}

		if(!is_string($apellidos) || strlen($apellidos) > 100)
		{
			throw new Exception('Los apellidos deben se una cadena de no mas de 100 caracteres.');
		}

		$this->Apellidos = $apellidos;
	}

	public function GetEmail()
	{
		return $this->Email;
	}

	public function SetEmail($email)
	{
		if(!isset($email) || empty($email))
		{
			throw new Exception('El correo electronico no puede ser nulo o vacio.');
		}

		if(preg_match("/^([0-9a-zA-Z]([-\.\w]*[0-9a-zA-Z])*@([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,9})$/", $email) == 0)
		{
			throw new Exception('El correo electronico no es valido.');
		}

		$this->Email = $email;
	}

	public function GetFechaNacimiento()
	{
		return $this->FechaNacimiento;
	}

	public function SetFechaNacimiento($fechanacimiento)
	{
		list($y, $m, $d) = explode("-", $fechanacimiento);
		if(!checkdate($m, $d, $y))
		{
			throw new Exception('Indique una fecha de nacimiento valida.');
		}

		$this->FechaNacimiento = $fechanacimiento;
	}

	public function GetGenero()
	{
		return $this->Genero;
	}

	public function SetGenero($genero)
	{
		if(!isset($genero) || empty($genero))
		{
			throw new Exception('Debe indicar el sexo');
		}

		if(!is_string($genero) || strlen($genero) != 1)
		{
			throw new Exception('El sexo es un caracter');
		}

		$this->Genero = $genero;
	}

	public function GetTelefonoMovil()
	{
		return $this->TelefonoMovil;
	}

	public function SetTelefonoMovil($telefonomovil)
	{
		if(!empty($telefonomovil))
		{
			if(!is_numeric($telefonomovil) || strlen($telefonomovil) != 9)
			{
				throw new Exception('El telefono no es valido');
			}
		}

		$this->TelefonoMovil = $telefonomovil;
	}

	public function GetFechaAlta()
	{
		return $this->FechaAlta;
	}

	public function SetFechaAlta($fechaalta)
	{
		if(!isset($fechaalta) || empty($fechaalta))
		{
			throw new Exception('Fecha de alta no puede ser nulo o vacio.');
		}

		list($y, $m, $d) = explode("-", $fechaalta);
		if(!checkdate($m, $d, $y))
		{
			throw new Exception('La fecha de alta debe ser una fecha valida.');
		}

		$this->FechaAlta = $fechaalta;
	}

	public function GetFechaBaja()
	{
		return $this->FechaBaja;
	}

	public function SetFechaBaja($fechabaja)
	{
		if(isset($fechabaja) )
		{
			list($y, $m, $d) = explode("-", $fechabaja);
			if(!checkdate($m, $d, $y))
			{
				throw new Exception('La fecha de baja debe ser una fecha valida.');
			}
		}

		$this->FechaBaja = $fechabaja;
	}

	public function GetFechaSisAlta()
	{
		return $this->FechaSisAlta;
	}
	
	public function jsonSerialize()
	{
		$ArregloResultado = array();
		$ArregloResultado["id"] = $this->GetId();
	
		foreach ($this as $key => $value)
		{
			if(is_object($value))
			{
				$ArregloResultado[$key] = json_encode($value, JSON_FORCE_OBJECT | JSON_PRETTY_PRINT);
			}
			else
			{
				$ArregloResultado[$key] = $value;
			}
		}
		return $ArregloResultado;
	}
}
?>